﻿#define _CRT_SECURE_NO_WARNINGS
//作者：宋安康
//#include<string.h>
//#include<stdio.h>
//int main()
//{
//	char arr[] = {"abcdef"};
//	size_t a = strlen(arr);   //统计/0之前的长度
//	printf("%zd ",a);
//	return 0;
//


//#include<stdio.h>
//#include<assert.h>
//size_t  my_strlen(const char* str) 
//{
//	size_t count = 0;
//	assert(str != NULL);
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

//size_t  my_strlen(const char* str)
//{
//	
//	assert(str != NULL);
//	char* start = str;
//	while (*str != '\0')
//	{ 
//		str++;
//	}
//	return str - start;
//}

////写一个函数，不能使用临时变量，模拟实现strlen----递归思想
//size_t my_strlen(const char* str)
//{
//	assert(str);
//	if (*str == '\0')
//		return 0;
//	else
//		return 1 + my_strlen(str + 1);
//}
//int main() 
//{
//	char arr[] = { "abcdef" };
//	size_t a = my_strlen(arr);
//	printf("%zd",a);
//	return 0;
//}

//strcpy 的使⽤和模拟实现  ---string copy
//1.参数顺序
//2.函数的功能，停⽌条件
//3.assert
//4.const修饰指针
//5.函数返回值
//6.题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分
// 
//char* my_strcpy(char* dest, const char* src)
//{
//	char* ret = dest;
//	assert(dest != NULL);
//	assert(src != NULL);
//
//	while ((*dest++ = *src++))
//	 {
//	;
//	 }
//	return ret;
// }
//#include<stdio.h>
//• 源字符串必须以 '\0' 结束。
//• ⽬标字符串中也得有 \0 ，否则没办法知道追加从哪⾥开始。
//• ⽬标空间必须有⾜够的⼤，能容纳下源字符串的内容。
//• ⽬标空间必须可修改。
//int main() {
//
//
//	char arr1[20] = {0};
//	char arr2[] = "hello";
//	strcpy(arr1,arr2);
//	printf("%s\n",arr1);
//	return 0;
//}

//模拟实现

//void my_strcpy(char* dest, char* src) 
//{
//	while (*src != '\0')
//	{	
//		*dest = *src;
	//	dest++;
	//	src++;
	//}
//	*dest = *src;
//
//}

#include<assert.h>
//char* my_strcpy(char* dest, char* src)
//{
//	//assert(dest != NULL);
//	//assert(src != NULL);
//	assert(dest);
//	assert(src);
//	char* ret = dest;
//	while (*dest++ = *src++) {
//		;//空语句}
//	}
//	return ret;
//}
//int main() {
//
//
//	char arr1[20] = {0};
//	char arr2[] = "hello";
//	
//	printf("%s\n", my_strcpy(arr1, arr2));
//	return 0;
//}


//NULL  本质是0，用于指针的初始化
//\0   \ddd形式的转义字符，本质是0，一般字符串的末尾
//0 数字0
//null或NUL --- 也是\0
//'0'  字符0 ， 本质是48

//strcat 的使⽤和模拟实现   --字符追加   
#include<stdio.h>
//#include<string.h>

char* my_strcat(char* dest ,const char* src) 
{
	assert(dest&&src);
	char* ret = dest;
	//1.找到目标字符串的\0
	while (*dest)
	{
		dest++;
	}
	//2.拷贝
	while (*dest++ = *src++)
	{
		;
	}
	return ret;

}

//int main()
//{
//	char arr1[20] = "hello ";
//	char arr2[] = "world";
//	my_strcat(arr1, arr1);   //无法自己给自己追加 --- 死循环
//	my_strcat(arr1, arr2);  
//	printf("%s\n", arr1);   //hello world字符串的追加
//	return 0;
//}



//strcmp 字符串的比较  <--- string compare 
//比较的是：对应位置上的字符大小，小的字符所在的字符串，小于另外一个字符串
//比较的不是字符串的长度！！！
//从左向右一个一个比较

//strcmp 的模拟实现
int my_strcmp(const char* s1 ,const char* s2) 
{
	if (*s1 == *s2)  //判断字符是否相等，相等则比较下一个字符
	{
		if (*s1 == '\0')
		{
			return 0;  //相等
		}
		s1++;
		s2++;
	}
	//if (*s1 > *s2)
	//{
	//	return 1;
	//}
	//else
	//	return -1;
	return *s1 - *s2;
}

int main()
{
	int ret = my_strcmp("abcd", "abcd");
	if (ret > 0)
	{
		printf("大于");
	}
	else if (ret = 0)
	{
		printf("等于");
	}
	else
	{
		printf("小于");
	}
	return 0;
}

//有符号
//%d -- int
//%hd -- short
//%ld -- long
//%lld -- longlong

//无符号
//%u
//%hu
//%lu
//%llu

//长度不受限制的字符串函数   -->  不安全
//strcpy
//strcat
//strcmp

//长度受限制的字符串函数   ---->  相对安全
//strncpy
//strncat
//strncmp

//strcpy——char * strncpy ( char * destination, const char * source, size_t num );
//num   操作字符的数量